from collections import OrderedDict

from apps.goods.models import GoodsChannel


def get_categories(request):
    # 1, 获取商品频道表的数据
    channels = GoodsChannel.objects.order_by('group_id', 'sequence')
    # 2, 遍历整个列表，取出每一个频道， 这里可以是一个有序字典，或者是普通字典
    categories = OrderedDict()
    for channel in channels:
        # 3, 通过频道获取频道id
        group_id = channel.group_id
        # 4, 判断频道id是否存在与categories
        if group_id not in categories:
            categories[group_id] = {"channels": [], "sub_cats": []}
        # 5, 通过频道的外键属性category获取一级分类对象
        cat1 = channel.category
        # 6, 拼接 channels中的数据
        categories[group_id]["channels"].append({
            "id": cat1,
            "name": cat1.name,
            "url": channel.url,
        })
        # 7, 这样，承上就做完了，接下来就是启下，根据一级分类查找二级分类，
        # 根据二级分类查找三级分类, subs 是关系字段, sub_cats 使我们需要构造的属性，其中存放的是三级分类
        for cat2 in cat1.subs.all():
            cat2.sub_cats = []
            # 根据二级分类查找三级分类
            for cat3 in cat2.subs.all():
                cat2.sub_cats.append(cat3)

            # 将拼接完成的数据添加到大字典中去
            categories[group_id]["sub_cats"].append(cat2)

    return categories